package gr8pefish.ironbackpacks.registry;
import gr8pefish.ironbackpacks.api.items.backpacks.interfaces.IBackpack;
import gr8pefish.ironbackpacks.api.items.backpacks.interfaces.ITieredBackpack;
import gr8pefish.ironbackpacks.api.items.backpacks.interfaces.IUpgradableBackpack;
import gr8pefish.ironbackpacks.api.register.IAllRecipesRegistry;
import gr8pefish.ironbackpacks.api.register.ItemIBackpackRegistry;
import gr8pefish.ironbackpacks.api.register.ItemIUpgradeRegistry;
import gr8pefish.ironbackpacks.config.ConfigHandler;
import gr8pefish.ironbackpacks.crafting.BackpackAddUpgradeRecipe;
import gr8pefish.ironbackpacks.crafting.BackpackIncreaseTierRecipe;
import gr8pefish.ironbackpacks.crafting.BackpackRemoveUpgradeRecipe;
import gr8pefish.ironbackpacks.items.backpacks.ItemBackpack;
import gr8pefish.ironbackpacks.libs.recipes.ItemBackpackRecipes;
import gr8pefish.ironbackpacks.libs.recipes.ItemCraftingRecipes;
import gr8pefish.ironbackpacks.libs.recipes.ItemUpgradeRecipes;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fml.common.registry.GameRegistry;
import net.minecraftforge.oredict.RecipeSorter;
import java.util.ArrayList;
import java.util.List;
/**
* Register all the recipes here.
*/
public class RecipeRegistry {
/**
* Main method that registers all the recipes
*/
public static void registerAllRecipes() {
//Basic Item Recipes
ItemCraftingRecipes.registerItemCraftingRecipes(); //register the recipes to get the recipes items
ItemUpgradeRecipes.registerItemUpgradeRecipes(); //register the recipes to get the the upgrades as items
ItemBackpackRecipes.registerItemBackpackRecipes(); //register all the recipes to get the backpacks directly
//=============Fancy Iron Backpacks Recipes===========
//Register as special recipes
RecipeSorter.register("RemoveUpgrade", BackpackRemoveUpgradeRecipe.class, RecipeSorter.Category.SHAPELESS, ""); //register my special recipe
RecipeSorter.register("AddUpgrade", BackpackAddUpgradeRecipe.class, RecipeSorter.Category.SHAPELESS, ""); //register my special recipe
RecipeSorter.register("IncreaseBackpackTier", BackpackIncreaseTierRecipe.class, RecipeSorter.Category.SHAPED, ""); //register my special recipe
//Register the recipes themselves
registerBackpackTierRecipes(); //register the recipes to upgrade a backpack to the next tier
registerBackpackUpgradeRemovalRecipes(); //register the recipes to remove upgrades from backpacks
registerBackpackUpgradeAdditionRecipes(); //register the recipes to add upgrades from backpacks
}
/**
* Sets all the non tiered backpack recipes.
* Not in items initialization in case one items uses another items from this mod, as that items may not be initialized yet (very likely).
*/
public static void setAllNonTierRecipes(){
setItemBackpackRecipes();
setUpgradeRecipes();
}
//===========================================================================Set Recipes==================================================================
private static void setItemBackpackRecipes(){
ItemRegistry.basicBackpack.setItemRecipe(ItemBackpackRecipes.basicBackpackRecipe);
}
private static void setUpgradeRecipes(){
if (!ConfigHandler.additionalUpgradePointsRecipeDisabled)
ItemRegistry.additionalUpgradePointsUpgrade.setItemRecipe(ItemUpgradeRecipes.additionalUpgradePointsRecipe);
if (!ConfigHandler.buttonUpgradeRecipeDisabled)
ItemRegistry.buttonUpgrade.setItemRecipe(ItemUpgradeRecipes.buttonUpgradeRecipe);
if (!ConfigHandler.damageBarUpgradeRecipeDisabled)
ItemRegistry.damageBarUpgrade.setItemRecipe(ItemUpgradeRecipes.damageBarUpgradeRecipe);
if (!ConfigHandler.depthUpgradeRecipeDisabled)
ItemRegistry.depthUpgrade.setItemRecipe(ItemUpgradeRecipes.depthUpgradeRecipe);
if (!ConfigHandler.eternityUpgradeRecipeDisabled)
ItemRegistry.eternityUpgrade.setItemRecipe(ItemUpgradeRecipes.eternityUpgradeRecipe);
if (ConfigHandler.renamingUpgradeRequired && !ConfigHandler.renamingUpgradeRecipeDisabled)
ItemRegistry.renamingUpgrade.setItemRecipe(ItemUpgradeRecipes.renamingUpgradeRecipe);
if (!ConfigHandler.nestingUpgradeRecipeDisabled)
ItemRegistry.nestingUpgrade.setItemRecipe(ItemUpgradeRecipes.nestingUpgradeRecipe);
if (!ConfigHandler.nestingUpgradeRecipeDisabled)
ItemRegistry.nestingAdvancedUpgrade.setItemRecipe(ItemUpgradeRecipes.nestingAdvancedUpgradeRecipe);
if (!ConfigHandler.quickDepositUpgradeRecipeDisabled)
ItemRegistry.quickDepositUpgrade.setItemRecipe(ItemUpgradeRecipes.quickDepositUpgradeRecipe);
if (!ConfigHandler.quickDepositPreciseUpgradeRecipeDisabled)
ItemRegistry.quickDepositPreciseUpgrade.setItemRecipe(ItemUpgradeRecipes.quickDepositPreciseUpgradeRecipe);
if (!ConfigHandler.craftingUpgradeRecipeDisabled)
ItemRegistry.craftingUpgrade.setItemRecipe(ItemUpgradeRecipes.craftingUpgradeRecipe);
if (!ConfigHandler.craftingSmallUpgradeRecipeDisabled)
ItemRegistry.craftingSmallUpgrade.setItemRecipe(ItemUpgradeRecipes.craftingSmallUpgradeRecipe);
if (!ConfigHandler.craftingTinyUpgradeRecipeDisabled)
ItemRegistry.craftingTinyUpgrade.setItemRecipe(ItemUpgradeRecipes.craftingTinyUpgradeRecipe);
if (!ConfigHandler.filterBasicUpgradeRecipeDisabled)
ItemRegistry.filterBasicUpgrade.setItemRecipe(ItemUpgradeRecipes.filterBasicUpgradeRecipe);
if (!ConfigHandler.filterFuzzyUpgradeRecipeDisabled)
ItemRegistry.filterFuzzyUpgrade.setItemRecipe(ItemUpgradeRecipes.filterFuzzyUpgradeRecipe);
if (!ConfigHandler.filterOreDictUpgradeRecipeDisabled)
ItemRegistry.filterOreDictUpgrade.setItemRecipe(ItemUpgradeRecipes.filterOreDictUpgradeRecipe);
if (!ConfigHandler.filterModSpecificUpgradeRecipeDisabled)
ItemRegistry.filterModSpecificUpgrade.setItemRecipe(ItemUpgradeRecipes.filterModSpecificUpgradeRecipe);
if (!ConfigHandler.filterAdvancedUpgradeRecipeDisabled)
ItemRegistry.filterAdvancedUpgrade.setItemRecipe(ItemUpgradeRecipes.filterAdvancedUpgradeRecipe);
if (!ConfigHandler.filterMiningUpgradeRecipeDisabled)
ItemRegistry.filterMiningUpgrade.setItemRecipe(ItemUpgradeRecipes.filterMiningUpgradeRecipe);
if (!ConfigHandler.filterVoidUpgradeRecipeDisabled)
ItemRegistry.filterVoidUpgrade.setItemRecipe(ItemUpgradeRecipes.filterVoidUpgradeRecipe);
if (!ConfigHandler.restockingUpgradeRecipeDisabled)
ItemRegistry.restockingUpgrade.setItemRecipe(ItemUpgradeRecipes.restockingUpgradeRecipe);
}
//=================================================================================Helper Registers==========================================================
/**
* Register the upgrade removal recipes for every backpack (if it is an IUpgradableBackpack)
*/
private static void registerBackpackUpgradeRemovalRecipes(){
for (int i = 0; i < ItemIBackpackRegistry.getSize(); i++){
IBackpack backpack = ItemIBackpackRegistry.getBackpackAtIndex(i);
if (backpack instanceof IUpgradableBackpack) {
BackpackRemoveUpgradeRecipe recipe = new BackpackRemoveUpgradeRecipe(new ItemStack((ItemBackpack)backpack), new ItemStack((ItemBackpack)backpack)); //Hardcoded to ItemBackpack
GameRegistry.addRecipe(recipe);
IAllRecipesRegistry.registerUpgradeRemovalRecipe(recipe);
}
}
}
/**
* Register the recipe for the addition of upgrades to an IUpgradeableBackpack.
* If the backpack is also an ITieredBackpack, then the tier of the upgrade must be lower than or equal to the backpack to allow it to be applied.
*/
private static void registerBackpackUpgradeAdditionRecipes() {
ArrayList<ItemStack> upgrades = new ArrayList<>();
for (int i = 0; i < ItemIUpgradeRegistry.getTotalSize(); i++)
upgrades.add(new ItemStack(ItemRegistry.upgradeItem, 1, i));
for (int i = 0; i < ItemIBackpackRegistry.getSize(); i++) {
IBackpack backpack = ItemIBackpackRegistry.getBackpackAtIndex(i);
if (backpack instanceof IUpgradableBackpack) {
for (ItemStack upgrade : upgrades) {
int upgradeTier = ItemIUpgradeRegistry.getItemUpgrade(upgrade).getTier(upgrade);
if (backpack instanceof ITieredBackpack) {
int backpackTier = ((ITieredBackpack) backpack).getTier(null);
if (upgradeTier <= backpackTier) {
BackpackAddUpgradeRecipe recipe = new BackpackAddUpgradeRecipe(new ItemStack((ItemBackpack) backpack), upgrade, new ItemStack((ItemBackpack) backpack)); //Hardcoded to ItemBackpack
GameRegistry.addRecipe(recipe);
IAllRecipesRegistry.registerUpgradeAdditionRecipe(recipe);
}
} else {
//TODO: remove casting for other backpacks (and in above for non-tiered ones)
BackpackAddUpgradeRecipe recipe = new BackpackAddUpgradeRecipe(new ItemStack((ItemBackpack) backpack), upgrade, new ItemStack((ItemBackpack) backpack)); //Hardcoded to ItemBackpack
GameRegistry.addRecipe(recipe);
IAllRecipesRegistry.registerUpgradeAdditionRecipe(recipe);
}
}
}
}
}
/**
* Register the recipe for the backpack to increase a tier.
*/
public static void registerBackpackTierRecipes(){
for (int i = 0; i < ItemIBackpackRegistry.getSize(); i++){
IBackpack backpack = ItemIBackpackRegistry.getBackpackAtIndex(i);
if (backpack instanceof ITieredBackpack) {
ITieredBackpack newPack = (ITieredBackpack) backpack;
List<Object[]> recipes = newPack.getTierRecipes(null);
if (recipes == null) break; //if you have no recipe to upgrade, you can't register that
List<ITieredBackpack> upgradedPacks = newPack.getBackpacksAbove(null); //unused items stack parameter
if (!recipes.isEmpty() && upgradedPacks != null && upgradedPacks.size() == recipes.size()) {
for (int j = 0; j < recipes.size(); j++) {
BackpackIncreaseTierRecipe tierRecipe = new BackpackIncreaseTierRecipe(new ItemStack((ItemBackpack)upgradedPacks.get(j)), recipes.get(j)); //hardcoded to ItemBackpack
GameRegistry.addRecipe(tierRecipe);
IAllRecipesRegistry.registerTierIncreaseRecipe(tierRecipe);
}
}
}
}
}
}